package main

import "fmt"

func main() {
	foo(10)
	fmt.Println(getHead([]int{1, 2, 3}))
	fmt.Println(getHead([]string{"one", "two", "three"}))

}

// 相似类型约束
func foo[T ~int](p T) {
	fmt.Println(p + 1)
}

// 自定义泛型无法使用~约束
// type someInterFaceA interface {
// 	doSomethingA()
// }
// func bar[T ~someInterFaceA](p T) {
// }

// 任何底层是 slice 的东西都能传
type SliceLike[T any] interface{ ~[]T }

func getHead[S SliceLike[T], T any](s S) T {
	if len(s) == 0 {
		var zero T
		return zero
	}
	return s[0]
}
